/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package enterprise.web_jpa_war.servlet;

import enterprise.web_jpa_war.entity.Oeuvre;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.UserTransaction;

/**
 *
 * @author jeddi
 */
@WebServlet(name = "FilteredCatalog", urlPatterns = {"/FilteredCatalog"})
public class FilteredCatalog extends HttpServlet {

    @PersistenceUnit
    private EntityManagerFactory emf;
    
    @Resource
    private UserTransaction utx;
    
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
            
            /* Algo :
             *  Récupérer les paramètres de recherche
             *  Construire la requête de recherche
             *  Exécuter la requête
             *  Afficher le résultat à l'utilisateur
             */
            
        EntityManager em = null;
        try {
            em = emf.createEntityManager();
            // Requête de base
            String query = "select o from Oeuvre o";
            
            // Récupérer les paramètres
            boolean hasParameter = false;
            String titre = (String) request.getParameter("titreOeuvre");
            String auteur = (String) request.getParameter("auteurOeuvre");
            String genre = (String) request.getParameter("genreOeuvre");
            String desc = (String) request.getParameter("descOeuvre");
            String type = (String) request.getParameter("type");
            
            // Traiter les paramètres
            if(titre != null && titre.trim().length() > 0) {
                query += " where UPPER(o.titre) LIKE '%" + titre.toUpperCase() + "%'";
                hasParameter = true;
            }
            
            if(auteur != null && auteur.trim().length() > 0) {
                if(hasParameter)
                    query += " and ";
                else {
                    query += " where ";
                    hasParameter = true;
                }
                query += " UPPER(o.auteur) LIKE '%" + auteur.toUpperCase() + "%'";
            }
            
            if(genre != null && genre.trim().length() > 0) {
                if(hasParameter)
                    query += " and ";
                else {
                    query += " where ";
                    hasParameter = true;
                }
                query += " UPPER(o.genre) LIKE '%" + genre.toUpperCase() + "%'";
            }
            
            if(desc != null && desc.trim().length() > 0) {
                if(hasParameter)
                    query += " and ";
                else {
                    query += " where ";
                    hasParameter = true;
                }
                query += " UPPER(o.description) LIKE '%" + desc.toUpperCase() + "%'";
            }
            
            if(type != null && type.trim().length() > 0) {
                if(hasParameter)
                    query += " and ";
                else {
                    query += " where ";
                    hasParameter = true;
                }
                query += " UPPER(o.type.typeName) LIKE '%" + type.toUpperCase() + "%'";
            }
             
            query += " order by o.type.typeName";
            
            // Exécuter la requête
            List oeuvres = em.createQuery(query).getResultList();
            Map<Oeuvre,Integer> nbDispos = new HashMap<Oeuvre, Integer>();
            for(int i = 0; i < oeuvres.size(); ++i) {
                String query2 = "select count(i) from Item i where i.dispo = " + true 
                        + " and i.oeuvre.id = "
                        + ((Oeuvre) oeuvres.get(i)).getId().toString();
                int nb = ((Long) em.createQuery(query2).getSingleResult()).intValue();
                nbDispos.put((Oeuvre) oeuvres.get(i), nb);
            }
            
            
            //Afficher le résultat
            request.setAttribute("oeuvreList",oeuvres);
            request.setAttribute("nbDispoList", nbDispos);
            request.getRequestDispatcher("LoadAllTypes").forward(request, response);
            
        } catch (Exception ex) {
            throw new ServletException(ex);
        } finally {
            if(em != null) {
                em.close();
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
